#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QListWidget>
#include <QMediaPlayer>
#include <QTimer>
#include <QDialog>
#include <QMouseEvent>

#include <mycomponent.h>
#include <delegate.h>
#include <lyrics.h>
#include <connection.h>

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class MusicList;
class Song;

class Widget : public QWidget
{
    Q_OBJECT

private slots:
    //按钮的响应函数
    void onClose();        //关闭程序
    void onWindowMin();    //窗口最小化

    void onShowMusiclistClicked();  //显示选中歌单
    void onAddMusiclistClicked();   //添加歌单
    void onOpenFolder();            //打开文件夹添加本地歌曲

    //右键菜单相关
    void onShowMusicListMenu(QPoint pos);  //显示歌单项右键菜单
    void onShowSongMenu(QPoint);           //显示歌曲项右键菜单

    void onActionCollect();                //收藏菜单项的响应函数
    void onActionDeleteMusiclist();        //删除歌单菜单项的响应函数
    void onActionPlayMusiclist();          //播放歌单菜单项的响应函数
    void onActionPlay();                   //播放该歌曲菜单项的响应函数
    void onActionDeleteSong();             //播放该歌曲菜单项的响应函数
    void onActionNextPlay();               //下一首播放菜单项的响应函数

    //播放相关
    void onPlay();                       //播放或暂停
    void onPre();                        //上一首
    void onNext();                       //下一首
    void onMediaStatusChanged(QMediaPlayer::MediaStatus status);  //播放状态发生变化时的响应函数
    void onChangePlayMode();             //切换播放模式

    //进度条相关
    void onSliderPressed();              //点击进度条滑块时的响应函数
    void onSliderReleased();             //释放进度条滑块时的响应函数
    void onSliderMoved(int);             //滑动进度条滑块时的响应函数
    void setPlaySliderValue();           //进度条定时器的执行函数
    void setVoiceSliderValue(int);       //拖动音量条

    //其他
    void setPlayTime();                  //根据当前播放进度设置播放时间
    //void itemDoubleClicked(QTableWidgetItem *item); //双击歌曲项的响应函数

    void showLyricWidget();              //显示\关闭歌词面板
    void showNextLyrics();               //歌词面板定时器的执行函数

    void showPlaylistWidget();           //显示播放列表

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

    QString getTime2Str(int time);          //数字时间转为字符时间
    void playSong(Song* song);              //从头播放歌曲
    void loadLyrics(QString FileName);      //加载歌词并显示
    void showNoLyrics();                    //无歌词的显示
    void setLyricsPos(int time);            //根据时间确定歌词位置
    void initUI();                          //加载QSS，自定义程序显示风格

    void setPlayTime(int time);             //设置当前播放时间，单位：毫秒
    void showMusiclist(MusicList* ml);      //显示本地歌曲列表

    void addPlaylist(MusicList* ml);        //添加歌单到播放列表

protected:
    //完成拖动程序窗口的功能需重载的函数
    virtual void mousePressEvent(QMouseEvent *event) override;
    virtual void mouseMoveEvent(QMouseEvent *event) override;
    virtual void mouseReleaseEvent(QMouseEvent *event) override;

    //处理自定义信号，这里主要处理点击进度条时发出的自定义信号，该信号用于完成一次性将滑块移动到点击位置的动作
    virtual bool event(QEvent *event) override;

private:
    Ui::Widget *ui;

    QMediaPlayer *player;                 //播放器
    QTimer *playslider_timer;             //进度条定时器

    QHash<Song*, Song*> playlist_hash;
    PlayList* playlist;                   //播放列表

    MusicList* cur_music_list;            //当前歌曲列表的歌单
    MyList<MusicList*>* m_playlists;      //所有歌单

    QMenu* musiclist_menu;                  //歌单项的右键菜单
    QMenu *song_menu;                       //歌曲项的右键菜单
    QMenu *show_musiclist_menu;             //收藏到歌单项，子菜单
    QAction* action_delete_musiclist;       //删除歌单项
    QAction* action_play_musiclist;         //播放歌单项

    bool mMoveing;                       //完成拖动程序窗口的功能用到的变量
    QPoint mMovePosition;                //完成拖动程序窗口的功能用到的变量

    bool isSliderMoved, isSliderPressed;  //判断进度条的点击是在滑块上还是进度条上

    //歌词面板相关
    Lyrics lyrics_info;                 //可读取保存歌词的对象
    QVector<QListWidgetItem*> lyrics;   //显示歌词的QListWidgetItem
    QTimer* lyrics_timer;               //歌词的定时器，执行高亮下一行歌词的函数
    int last_time = 0;                  //当前高亮歌词行的时间
    int cur_lyrics_line;                //当前高亮歌词的行数

    QFont font_normal;                 //非高亮歌词的字体
    QFont font_bold;                   //高亮歌词的字体
};

#endif // WIDGET_H
